package gob.osinerg.emergencia.action;

import gob.osinerg.emergencia.bean.FormularioAnexo;
import gob.osinerg.emergencia.bean.FormularioEmergencia;
import gob.osinerg.emergencia.bean.UsuarioBean;
import gob.osinerg.emergencia.form.UploadFormularioEmergenciaForm;
import gob.osinerg.emergencia.service.DominioService;
import gob.osinerg.emergencia.service.FormularioEmergenciaService;
import gob.osinerg.emergencia.service.GenericService;
import gob.osinerg.emergencia.util.Util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;


public class UploadFormularioEmergenciaAction extends GenericAction{
	
	private Log log = LogFactory.getLog(UploadFormularioEmergenciaAction.class);
	private FormularioEmergenciaService service;
	private DominioService dominioService;
	private GenericService genericService;
	
	public ActionForward inicio(ActionMapping actionMapping,
            ActionForm actionForm,
            HttpServletRequest request,
            HttpServletResponse response) throws java.lang.Exception {
		
		HttpSession session = request.getSession();
		UploadFormularioEmergenciaForm f = (UploadFormularioEmergenciaForm)actionForm;
		f.setNumeroEmerg("");
		f.setLista(new ArrayList());
		f.setFile(null);
		
		//f.setListTipoEmergencia(dominioService.selectByDominio("EMERG_TIPO"));
		//f.setListTipoInforme(dominioService.selectByDominio("EMERG_TIPO_FORM"));
		session.setAttribute("TipoEmergencia", ListToMap(dominioService.selectByDominio("EMERG_TIPO")));
		session.setAttribute("TipInforme", ListToMap(dominioService.selectByDominio("EMERG_TIPO_FORM")));
		return actionMapping.findForward("inicio");
	}
	
	public ActionForward buscar(ActionMapping actionMapping,
            ActionForm actionForm,
            HttpServletRequest request,
            HttpServletResponse response) throws java.lang.Exception {
		HttpSession session = request.getSession();
		UsuarioBean usuario = (UsuarioBean)session.getAttribute("UsuarioBean");
		UploadFormularioEmergenciaForm f = (UploadFormularioEmergenciaForm)actionForm;
		FormularioEmergencia bean = new FormularioEmergencia();
		bean.setNmroEmrgncia(f.getNumeroEmerg());
		bean.setUsrioCrdor(usuario.getCodigoLogin());
		f.setLista(genericService.getFindCriteria(bean));
		
		
		return actionMapping.findForward("inicio");
	}
	
	public ActionForward inicioSubirArchivos(ActionMapping actionMapping,
            ActionForm actionForm,
            HttpServletRequest request,
            HttpServletResponse response) throws java.lang.Exception {
		
		UploadFormularioEmergenciaForm f = (UploadFormularioEmergenciaForm)actionForm;
		String index = request.getParameter("sel");
		if(!StringUtils.isEmpty(index)){
			FormularioEmergencia formu = (FormularioEmergencia)f.getLista().get(Integer.parseInt(index));
			f.setBean(formu);

			//Buscamos los archivos
			FormularioAnexo bean = new FormularioAnexo();
			bean.setFrmlrioEmergId(formu.getId());
			f.setLista(genericService.getFindCriteria(bean));
			
			//Validamos si ya fue generado la constacia de mesa partes
			if(f.getLista().size()>0){
				FormularioAnexo fa = (FormularioAnexo)f.getLista().get(0);
				if(StringUtils.isEmpty(fa.getNroMesaParte())){
					request.setAttribute("flagOK",Boolean.TRUE);
				}
				
			}
			
		}
		return actionMapping.findForward("upload");
	}
	
	public ActionForward subirArchivos(ActionMapping actionMapping,
            ActionForm actionForm,
            HttpServletRequest request,
            HttpServletResponse response) throws java.lang.Exception {
		
		ActionMessages mensage = new ActionMessages();
		String ruta = ResourceBundle.getBundle("gob.osinerg.resources.parameter").getString("directorio.archivos.emergencia");
		UploadFormularioEmergenciaForm f = (UploadFormularioEmergenciaForm)actionForm;
		FormularioEmergencia formu = (FormularioEmergencia)f.getBean();
		
		FormularioAnexo formuAnex = new FormularioAnexo();
    	formuAnex.setFrmlrioEmergId(formu.getId());
    	formuAnex.setArchvoNmbre(f.getFile().getFileName());
    	formuAnex.setArchvoSize(String.valueOf(f.getFile().getFileSize()));
    	formuAnex.setFchaCrcion(new Date());
    	genericService.save(formuAnex);
    	
    	//Guardamos el Archivo en el Servidor
    	String nombreArchivo=formuAnex.getFrmlrioEmergId()+"_"+formuAnex.getId()+"_"+formuAnex.getArchvoNmbre();
    	File file = new File(ruta,nombreArchivo);
    	FileOutputStream fileOutStream = new FileOutputStream(file);
        fileOutStream.write(f.getFile().getFileData());
        fileOutStream.flush();
        fileOutStream.close();
    	f.getFile().getInputStream().close();

    	//Buscamos los archivos
    	FormularioAnexo fab = new FormularioAnexo();
    	fab.setFrmlrioEmergId(formu.getId());
    	f.setLista(genericService.getFindCriteria(fab));
		//Para que me deje subir los archivos
    	request.setAttribute("flagOK",Boolean.TRUE);
    	
    	mensage.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("messages.insert.successful"));
    	saveMessages(request, mensage);
    	
		return actionMapping.findForward("upload");
	}
	
	public ActionForward ver(ActionMapping actionMapping,
            ActionForm actionForm,
            HttpServletRequest request,
            HttpServletResponse response) throws java.lang.Exception {
		
		String ruta = ResourceBundle.getBundle("gob.osinerg.resources.parameter").getString("directorio.archivos.emergencia");
		
		UploadFormularioEmergenciaForm f = (UploadFormularioEmergenciaForm)actionForm;
		String index = request.getParameter("sel");
		if(!StringUtils.isEmpty(index)){
			FormularioAnexo bean = (FormularioAnexo)f.getLista().get(Integer.parseInt(index));
    		String nombreArchivo = bean.getFrmlrioEmergId()+"_"+bean.getId()+"_"+bean.getArchvoNmbre();
    		File file = new File(ruta,nombreArchivo);
			FileInputStream in = new FileInputStream(file);
			ServletOutputStream out = response.getOutputStream();
			String ext = bean.getArchvoNmbre().substring(bean.getArchvoNmbre().lastIndexOf('.') + 1).toLowerCase();
			 if (Util.MIME_TYPES.containsKey(ext)){
			    response.setContentType(Util.MIME_TYPES.get(ext).toString());
			 }
			response.setHeader("Content-Disposition", "attachment;filename="+bean.getArchvoNmbre());
			response.setContentLength(in.available());
			int c;
			while((c=in.read()) != -1){
			out.write(c);
			}
			out.flush();
			in.close();
			out.close();
			
		}

		return null;
	}
	
	public ActionForward eliminar(ActionMapping actionMapping,
            ActionForm actionForm,
            HttpServletRequest request,
            HttpServletResponse response) throws java.lang.Exception {
		String ruta = ResourceBundle.getBundle("gob.osinerg.resources.parameter").getString("directorio.archivos.emergencia");
		UploadFormularioEmergenciaForm f = (UploadFormularioEmergenciaForm)actionForm;
		String index = request.getParameter("sel");
		if(!StringUtils.isEmpty(index)){
			FormularioAnexo bean = (FormularioAnexo)f.getLista().get(Integer.parseInt(index));
			
			//Eliminamos el Archivo de la BD
			genericService.delete(bean);
	    	
			//Eliminamos el Archivo del servidor	
			String nombreArchivo = bean.getFrmlrioEmergId()+"_"+bean.getId()+"_"+bean.getArchvoNmbre();
    		File file = new File(ruta,nombreArchivo);
    		if(file.delete()){
    			log.debug("Se elimino el Archivo : "+nombreArchivo);
    		}else{
    			log.error("No se pudo eliminar el Archivo : "+nombreArchivo);
    		}
    			
	   		 //Buscamos los archivos
	       	FormularioAnexo fab = new FormularioAnexo();
	       	fab.setFrmlrioEmergId(bean.getFrmlrioEmergId());
	       	f.setLista(genericService.getFindCriteria(fab));
			
		}
		
		return actionMapping.findForward("upload");
	}
	
	public ActionForward generarMesaParte(ActionMapping actionMapping,
            ActionForm actionForm,
            HttpServletRequest request,
            HttpServletResponse response) throws java.lang.Exception {
	
		UploadFormularioEmergenciaForm f = (UploadFormularioEmergenciaForm)actionForm;
		FormularioEmergencia formu = (FormularioEmergencia)f.getBean();
		
		String nroMesaParte = service.getNumeroMesaParte(formu.getUniopeId(),formu.getUnifisId());
		
		service.saveMesaParteArchivos(formu.getId(),nroMesaParte);
		
		request.setAttribute("nroMesaParte", nroMesaParte);
		return actionMapping.findForward("constancia");
	}
	
	 private Map ListToMap(List lista) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException{
	    	Map mapa = new HashMap();
	    	
	    	for (int i=0;i<lista.size();i++){
	    		Object obj = lista.get(i);
	    		mapa.put(BeanUtils.getProperty(obj, "id"), BeanUtils.getProperty(obj, "descripcion"));
	    		
	    	}
	    	
	    	return mapa;
	    }
	 
	public void setService(FormularioEmergenciaService service) {
		this.service = service;
	}

	public void setDominioService(DominioService dominioService) {
		this.dominioService = dominioService;
	}

	public void setGenericService(GenericService genericService) {
		this.genericService = genericService;
	}
	
	
}
